package com.freitas.carlos;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;

import javax.swing.JFileChooser;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JCheckBox;

import org.eclipse.swt.custom.CBanner;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JTextArea;

public class EditorNivel {

	private JFrame frame;
	private JTextField txtCaminhoAtlas;
	private JTextField txtTamanhoInimigo;
	private JTextField txtPontosInimigo;
	private JTextField txtPosicaoInimigo;
	private JTextField txtVelocidadeInimigo;
	private JTextField txtEnergiaInimigo;
	private JFileChooser fcArquivos;
	private BufferedReader brArquivo;
	private List<String> listaAtlas;
	private JComboBox<String> cbPlanoFundo;
	private JComboBox<String> cbParallax;
	private JComboBox<String> cbInimigos;
	private JTextArea taInimigos;
	private JComboBox cbTipoTiro;
	private JComboBox cbMovimentoInimigo;
	private JCheckBox chbChefe;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					EditorNivel window = new EditorNivel();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public EditorNivel() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	
	public void LimpaCampos()
	{
		txtTamanhoInimigo.setText("");
		txtPontosInimigo.setText("");
		txtPosicaoInimigo.setText("");
		txtVelocidadeInimigo.setText("");
		txtEnergiaInimigo.setText("");
		chbChefe.setSelected(false);
	}
	
	public void GeraInimigos()
	{
		String chefe = "N";
		
		if (chbChefe.isSelected())
			chefe = "S";
		else 
			chefe = "N";
		
		taInimigos.setText(taInimigos.getText() + cbInimigos.getSelectedItem().toString() + "|" + 
				cbMovimentoInimigo.getSelectedItem().toString() + "|" + txtTamanhoInimigo.getText() + "|" +
				txtPontosInimigo.getText() + "|" + txtPosicaoInimigo.getText() + "|" +
				txtVelocidadeInimigo.getText() + "|" + txtEnergiaInimigo.getText() + "|" + chefe + "|" + 
				cbTipoTiro.getSelectedItem().toString() + "\n");
	}
	
	public void GeraArquivoFase()
	{
		
	}
	
	// Carrega o arquivo Atlas.
	public List<String> CarregaArquivoAtlas(String arquivo)
	{
		List<String> linhasLidas = new ArrayList<String>();
		
		try {
			brArquivo = new BufferedReader(new FileReader(arquivo));
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		String linha;
		
		// Pulas as cinco primeiras linhas.
		for (int i = 0; i <= 4; i++)
		{
			try {
				
				brArquivo.readLine();
				
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		// Pega somente as linhas que contem os nomes das imagens.
		try {
			while ((linha = brArquivo.readLine()) != null)
			{
				if (!linha.startsWith(" "))
					linhasLidas.add(linha);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		try {
			brArquivo.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return linhasLidas;
	}
	
	private void initialize() {
		frame = new JFrame();
		frame.setResizable(false);
		frame.setBounds(100, 100, 389, 564);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JPanel painel = new JPanel();
		frame.getContentPane().add(painel, BorderLayout.CENTER);
		painel.setLayout(null);
		
		JLabel lblCarregarAtlas = new JLabel("Carregar Atlas");
		lblCarregarAtlas.setBounds(10, 11, 106, 14);
		painel.add(lblCarregarAtlas);
		
		txtCaminhoAtlas = new JTextField();
		txtCaminhoAtlas.setToolTipText("Caminho do Atlas do Jogo");
		txtCaminhoAtlas.setEnabled(false);
		txtCaminhoAtlas.setEditable(false);
		txtCaminhoAtlas.setBounds(103, 8, 151, 20);
		painel.add(txtCaminhoAtlas);
		txtCaminhoAtlas.setColumns(10);
		
		fcArquivos = new JFileChooser();
		listaAtlas = new ArrayList<String>();
		
		JButton btnBuscar = new JButton("Buscar");
		btnBuscar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				int retorno;
				retorno = fcArquivos.showOpenDialog(null);
				
				// Abre o Selecionador de Arquivos.
				if (retorno == JFileChooser.APPROVE_OPTION)
				{
					txtCaminhoAtlas.setText(fcArquivos.getSelectedFile().getAbsolutePath());
					listaAtlas = CarregaArquivoAtlas(txtCaminhoAtlas.getText());
					
					// Insere os valores nos ComboBoxes.
					for (int i = 0; i < listaAtlas.size(); i++)
					{
						cbPlanoFundo.addItem(listaAtlas.get(i));
						cbParallax.addItem(listaAtlas.get(i));
						cbInimigos.addItem(listaAtlas.get(i));
					}
				}
			}
		});
		
		btnBuscar.setToolTipText("Busca o Arquivo Atlas do Jogo.");
		btnBuscar.setBounds(280, 7, 93, 23);
		painel.add(btnBuscar);
		
		JLabel lblPlanoDeFundo = new JLabel("Plano de Fundo");
		lblPlanoDeFundo.setBounds(10, 38, 93, 14);
		painel.add(lblPlanoDeFundo);
		
		cbPlanoFundo = new JComboBox<String>();
		cbPlanoFundo.setToolTipText("Seleciona o Plano de Fundo.");
		cbPlanoFundo.setBounds(20, 63, 140, 20);
		painel.add(cbPlanoFundo);
		
		JLabel lblPlanoParallax = new JLabel("Plano Parallax");
		lblPlanoParallax.setBounds(188, 38, 95, 14);
		painel.add(lblPlanoParallax);
		
		cbParallax = new JComboBox<String>();
		cbParallax.setToolTipText("Seleciona o Plano Parallax");
		cbParallax.setBounds(198, 63, 140, 20);
		painel.add(cbParallax);
		
		JLabel lblInimigo = new JLabel("Inimigo");
		lblInimigo.setBounds(10, 94, 70, 14);
		painel.add(lblInimigo);
		
		cbInimigos = new JComboBox<String>();
		cbInimigos.setToolTipText("Seleciona o Inimigo.");
		cbInimigos.setBounds(20, 119, 140, 20);
		painel.add(cbInimigos);
		
		JButton btnAdicionar = new JButton("Adicionar");
		btnAdicionar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
			
				GeraInimigos();
				
				LimpaCampos();
			}
		});
		btnAdicionar.setToolTipText("Adicionar as Informa\u00E7\u00F5es na Tabela Abaixo.");
		btnAdicionar.setBounds(261, 286, 112, 23);
		painel.add(btnAdicionar);
		
		JLabel lblTamanho = new JLabel("Tamanho (x,y)");
		lblTamanho.setBounds(10, 150, 93, 14);
		painel.add(lblTamanho);
		
		txtTamanhoInimigo = new JTextField();
		txtTamanhoInimigo.setToolTipText("Tamanho do Inimigo (x, y).");
		txtTamanhoInimigo.setBounds(20, 175, 86, 20);
		painel.add(txtTamanhoInimigo);
		txtTamanhoInimigo.setColumns(10);
		
		JLabel lblPontos = new JLabel("Pontos");
		lblPontos.setBounds(127, 150, 46, 14);
		painel.add(lblPontos);
		
		txtPontosInimigo = new JTextField();
		txtPontosInimigo.setToolTipText("Pontua\u00E7\u00E3o que ser\u00E1 Adicionada ao Jogador Quando o Inimigo for Destru\u00EDdo.");
		txtPontosInimigo.setBounds(137, 175, 86, 20);
		painel.add(txtPontosInimigo);
		txtPontosInimigo.setColumns(10);
		
		JLabel lblPosicao = new JLabel("Posi\u00E7\u00E3o (x,y)");
		lblPosicao.setBounds(237, 150, 86, 14);
		painel.add(lblPosicao);
		
		txtPosicaoInimigo = new JTextField();
		txtPosicaoInimigo.setToolTipText("Poisi\u00E7\u00E3o no N\u00EDvel em que o Inimigo est\u00E1 Posicionado (x, y).");
		txtPosicaoInimigo.setBounds(252, 175, 86, 20);
		painel.add(txtPosicaoInimigo);
		txtPosicaoInimigo.setColumns(10);
		
		JLabel lblMovimento = new JLabel("Movimento");
		lblMovimento.setBounds(188, 94, 70, 14);
		painel.add(lblMovimento);
		
		cbMovimentoInimigo = new JComboBox();
		cbMovimentoInimigo.setToolTipText("Seleciona o Tipo de Movimento do Inimigo");
		cbMovimentoInimigo.setModel(new DefaultComboBoxModel(new String[] {"ONDULAR", "CIRCULAR", "ETC"}));
		cbMovimentoInimigo.setBounds(198, 119, 140, 20);
		painel.add(cbMovimentoInimigo);
		
		JLabel lblVelocidade = new JLabel("Velocidade");
		lblVelocidade.setBounds(10, 206, 77, 14);
		painel.add(lblVelocidade);
		
		txtVelocidadeInimigo = new JTextField();
		txtVelocidadeInimigo.setToolTipText("Velocidade do Inimigo.");
		txtVelocidadeInimigo.setBounds(20, 231, 86, 20);
		painel.add(txtVelocidadeInimigo);
		txtVelocidadeInimigo.setColumns(10);
		
		JLabel lblEnergia = new JLabel("Energia");
		lblEnergia.setBounds(127, 206, 46, 14);
		painel.add(lblEnergia);
		
		txtEnergiaInimigo = new JTextField();
		txtEnergiaInimigo.setToolTipText("Total de Energia que o Inimigo tem.");
		txtEnergiaInimigo.setBounds(137, 231, 86, 20);
		painel.add(txtEnergiaInimigo);
		txtEnergiaInimigo.setColumns(10);
		
		JLabel lblTipoTiro = new JLabel("Tipo Tiro");
		lblTipoTiro.setBounds(10, 262, 70, 14);
		painel.add(lblTipoTiro);
		
		cbTipoTiro = new JComboBox();
		cbTipoTiro.setToolTipText("Tipo do Tiro que o Inimigo vai Atirar.");
		cbTipoTiro.setModel(new DefaultComboBoxModel(new String[] {"FOGO", "GELO", "ETC"}));
		cbTipoTiro.setBounds(20, 287, 140, 20);
		painel.add(cbTipoTiro);
		
		chbChefe = new JCheckBox("Chefe?");
		chbChefe.setToolTipText("Marcar se o Inimigo \u00E9 o Chefe do N\u00EDvel.");
		chbChefe.setBounds(260, 230, 97, 23);
		painel.add(chbChefe);
		
		JButton btnGravar = new JButton("Gravar");
		btnGravar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
			}
		});
		btnGravar.setBounds(147, 501, 89, 23);
		painel.add(btnGravar);
		
		taInimigos = new JTextArea();
		taInimigos.setToolTipText("Os Inimigos Inseridos na Fase Aparecem Aqui.");
		taInimigos.setEnabled(false);
		taInimigos.setEditable(false);
		taInimigos.setBounds(10, 318, 363, 172);
		painel.add(taInimigos);
	}
}
